package com.dc.juc.example._3_atomic;

import com.dc.juc.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicReference;

/**
 * Description: AtomicReference类提供了一个可以原子读写的对象引用变量。
 *  原子意味着尝试更改相同AtomicReference的多个线程（例如，使用比较和交换操作）不会使AtomicReference最终达到不一致的状态。
 *  AtomicReference甚至有一个先进的compareAndSet（）方法，它可以将引用与预期值（引用）进行比较，
 *  如果它们相等，则在AtomicReference对象内设置一个新的引用。
 *
 * @author: gdc
 * @date: 2021/8/2
 * @version 1.0
 */
@Slf4j
@ThreadSafe
public class _5_AtomicReference {

    private static AtomicReference<Integer> COUNT = new AtomicReference<>(0);

    public static void main(String[] args){
        log.info("COUNT:{}", COUNT);
        COUNT.compareAndSet(0, 2);      // 2
        COUNT.compareAndSet(0, 1);      // no
        COUNT.compareAndSet(1, 3);      // no
        COUNT.compareAndSet(2, 4);      // 4
        COUNT.compareAndSet(3, 5);      // 5

        log.info("COUNT:{}", COUNT);
    }

}
